home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / language / embedded / 68hc11 / xcc11run.asm < prev   
Assembly Source File  |  1994-10-20  |  9KB  |  560 lines

  1. /* C include file -- run-time support for Small-C 
  2.  */
  3.  
  4. #asm
  5.  
  6.  
  7.  
  8.  
  9.  
  10. *   SmallC Cross Compiler Run-Time Support.  
  11. *   Target 68HC11.
  12.  
  13. *    L. Konneker Feb. 7, 1987 
  14. *    Retarget for 6811 and different assembler.
  15.  
  16.  
  17.  
  18. ******************************************************
  19. *    Run-time start off 
  20. *
  21. *   for MC68HC11 EVB board
  22. *
  23.  
  24. *     Initialize stack
  25. *     For EVB, put stack in high user ram, HEX DFFF downward
  26.     ldx    #57343      hex DFFF
  27.     txs
  28.     
  29. *     Some would clear all of memory, not necessary on EVB.
  30.  
  31. *    Clear certain things so that start conditions are always same.
  32. *    This is defensive programming but may hide bugs.
  33.     clra
  34.     clrb
  35.     jmp    _main
  36. *    note main must not return
  37.  
  38. *    Run time routines are not listed in assembler output.
  39.     OPT    nol
  40.     
  41. ******************************************************
  42. *    Small C v1 comparison support 
  43. *    All are dyadic except for lneg. 
  44.  
  45. *   Reg x used as a temp  
  46.  
  47.  
  48.  
  49. cceq:    
  50.     tsx
  51.     cpd 2,x 
  52.     beq cctrue 
  53.     bra ccfals 
  54.  
  55.  
  56. ccne:    
  57.     tsx
  58.     cpd 2,x  
  59.     bne cctrue 
  60.     bra ccfals 
  61.  
  62.  
  63. cclt:    
  64.     tsx
  65.     cpd 2,x  
  66.     bgt cctrue 
  67.     bra ccfals 
  68.  
  69.  
  70. ccle:    
  71.     tsx
  72.     cpd 2,x 
  73.     bge cctrue 
  74.     bra ccfals 
  75.  
  76.  
  77. ccgt:    
  78.     tsx
  79.     cpd 2,x 
  80.     blt cctrue 
  81.     bra ccfals 
  82.  
  83.  
  84. ccge:    
  85.     tsx
  86.     cpd 2,x 
  87.     ble cctrue 
  88.     bra ccfals 
  89.  
  90.  
  91. ccult:    
  92.     tsx
  93.     cpd 2,x 
  94.     bhi cctrue 
  95.     bra ccfals 
  96.  
  97.  
  98. ccule:    
  99.     tsx
  100.     cpd 2,x 
  101.     bhs cctrue 
  102.     bra ccfals 
  103.  
  104.  
  105. ccugt:    
  106.     tsx
  107.     cpd 2,x 
  108.     blo cctrue 
  109.     bra ccfals 
  110.  
  111.  
  112. ccuge:    
  113.     tsx
  114.     cpd 2,x 
  115.     bls cctrue 
  116.     bra ccfals 
  117.  
  118.  
  119. * boolean negate,  with coercion to boolean 
  120. cclneg:    cpd #0 
  121.     beq cclne1 
  122.     ldd #0 
  123.     rts 
  124. cclne1:    ldd #1 
  125.     rts 
  126.  
  127.  
  128. * coerce to boolean type 
  129. ccbool:
  130.     bsr    cclneg 
  131.     bra    cclneg 
  132.  
  133.  
  134. ******************************************************
  135. * true and false returns common to all compare operations
  136. cctrue:
  137.     ldd #1 
  138.     bra        ccret    to common return
  139.  
  140. ccfals:    
  141.     clra 
  142.     clrb 
  143.     bra        ccret    to common return
  144.  
  145. ******************************************************
  146. * relic ???
  147. _Xstktop:
  148. * Put stack pointer in reg D     
  149.     tsx 
  150.     xgdx 
  151.     rts
  152.     
  153. ******************************************************
  154. * boolean
  155.  
  156. * inclusive or primary and calling environ stacktop 
  157. ccior:
  158.     tsx
  159.     oraa    2,x
  160.     orab    3,x
  161.     bra        ccret
  162.  
  163. * exclusive or primary and calling environ stacktop
  164. ccxor:
  165.     tsx            get copy of stack ptr
  166.     eora    2,x    form result 
  167.     eorb    3,x
  168.     bra     ccret
  169.      
  170. * and primary and calling environ stacktop
  171. ccand:
  172.     tsx
  173.     anda    2,x
  174.     andb    3,x
  175.     bra        ccret
  176.     
  177. ******************************************************
  178. * misc
  179.  
  180. * sign extend low byte primary into high byte primary
  181. ccsex:
  182.     clra
  183.     tstb
  184.     bpl    *+3
  185.     coma
  186.     rts
  187.     
  188.  
  189. ******************************************************
  190. * shift 
  191.  
  192. * entry : D contains shift count, stack + 2 is operand
  193. * exit  : D contains shifted operand, stack is restored
  194. *
  195. * Uses y reg.
  196. * No checking for negative shift count.
  197.  
  198. * First, move shift count from d to x and move operand
  199. * from stack to d.
  200. ccasr:
  201.     xgdx
  202.     tsy
  203.     ldd        2,y
  204. ccasr1:
  205.     cpx        #0
  206.     ble        ccret
  207.     asra
  208.     rorb
  209.     dex
  210.     bra ccasr1
  211.     
  212.  
  213. * left
  214. ccasl:
  215.     xgdx
  216.     tsy
  217.     ldd        2,y
  218. ccasl1:
  219.     cpx        #0
  220.     ble        ccret
  221.     aslb
  222.     rola
  223.     dex
  224.     bra ccasl1
  225.     
  226. ******************************************************
  227. * A return routine common to shift and bitwise logical operations
  228. * Move ret adr down the stack on top of operand
  229. * Assert that on entry to this routine,
  230. * the stack ptr is still as it was on entry to the routine that
  231. * jumped here.
  232. * Must preserve reg D since it has the result.
  233. * Uses reg y.
  234. ccret:
  235.     pulx            capture return address
  236.     tsy                set up y as stack top ptr
  237.     stx        ,y        store ret adr on top of stack
  238.     rts
  239.     
  240. ******************************************************
  241. * Two's complement negate the primary register
  242. ccneg:
  243.     coma        one's complement
  244.     comb
  245.     addd    #1    plus one
  246.     rts
  247.  
  248. ******************************************************
  249. * Mult 16 bit times 16 bit yielding 16 bit.
  250. * Overflow is possible, not checked.
  251. * Signed and unsigned, same entry point.
  252.  
  253. * entry : D contains one operand, 
  254. *            @ stackptr is return adr
  255. *            @ stackptr + 2 is operand
  256. * exit  : D contains 16 bit operand,
  257. *            stackptr is entry stackptr + 4 ( stack is restored
  258. *            to as it was before caller pushed operand.)
  259. *
  260. cctmpd    equ        0
  261. cctmpx    equ        2
  262. ccrslt    equ        6
  263.  
  264.  
  265. ccsmul:
  266. ccmul:
  267. * shuffle stack
  268.     tsx
  269.     ldx        2,x
  270.     pshx            x op    
  271.     pshb            d op
  272.     psha
  273. * stack is now
  274. *    d op
  275. *    x op
  276. *    return address
  277. *    word for result
  278. * do multiply
  279.     tsx
  280.     ldaa    cctmpx+1,x    lo d times lo x
  281.     mul
  282.     std        ccrslt,x
  283.     ldd        cctmpd+1,x    lo d times hi x
  284.     mul
  285.     addb    ccrslt,x    add hi byte of partial result 
  286.     stab    ccrslt,x
  287.     ldaa    cctmpd,x    hi d times lo x
  288.     ldab    cctmpx+1,x
  289.     mul
  290.     addb    ccrslt,x    add hi byte of partial result
  291.     stab    ccrslt,x
  292. * restore stack, get result in d
  293.     pulx
  294.     pulx
  295.     puly    ret adr
  296.     pula    result
  297.     pulb
  298.     pshy
  299.     rts
  300.  
  301.  
  302. ******************************************************
  303. * Divide 16 bit times 16 bit yielding 16 bit.
  304. * Underflow is possible, not checked.
  305. * Signed and unsigned, same entry point.
  306.  
  307.  
  308. * entry : D contains divisor, 
  309. *            @ stackptr is return adr
  310. *            @ stackptr + 2 is dividend
  311. * exit  : D contains 16 bit quotient,
  312. *            remainder not returned.
  313. *            stackptr is entry stackptr + 4 ( stack is restored
  314. *            to as it was before caller pushed operand.)
  315.  
  316. * ccsdiv
  317. * Not implemented yet.  
  318. * What follows is 6809 code.
  319. * To Be Done: convert all labels to start with cc
  320.  
  321. *|    signed divide
  322. *|    calling: (left / right)
  323. *|        push left
  324. *|        ldd right
  325. *|        jsr sdiv
  326. *|    result in d, arg popped.
  327. *|
  328. *    left=6
  329. *    right=2
  330. *    sign=1
  331. *    count=0
  332. *    return=4
  333. *    CARRY=1
  334. *.globl sdiv,div,ASSERTFAIL
  335. *.globl prabs
  336. *sdiv:    leas    -4(s)
  337. *    std    right(s)
  338. *    bne    nozero
  339. *    swi2
  340. *    .byte    ASSERTFAIL
  341. *nozero:    jsr    prabs
  342. *div:    clr    count(s)    | prescale divisor
  343. *    inc    count(s)
  344. *mscl:    inc    count(s)
  345. *    aslb
  346. *    rola
  347. *    bpl    mscl
  348. *    std    right(s)
  349. *    ldd    left(s)
  350. *    clr    left(s)
  351. *    clr    left+1(s)
  352. *div1:    subd    right(s)    | check subtract
  353. *    bcc    div2
  354. *    addd    right(s)
  355. *    andcc    #~CARRY
  356. *    bra    div3
  357. *div2:    orcc    #CARRY
  358. *div3:    rol    left+1(s)    | roll in carry
  359. *    rol    left(s)
  360. *    lsr    right(s)
  361. *    ror    right+1(s)
  362. *    dec    count(s)
  363. *    bne    div1
  364. *    ldd    left(s)
  365. *    tst    sign(s)        | sign fiddle
  366. *    beq    nochg
  367. *    nega
  368. *    negb
  369. *    sbca    #0
  370. *nochg:    std    right(s)    | move return addr
  371. *    ldd    return(s)
  372. *    std    left(s)
  373. *    ldd    right(s)
  374. *    leas    6(s)
  375. *    rts
  376. *
  377.  
  378. *|    prabs.  converts both args to unsigned, and
  379. *|    remembers result sign as sign a eor sign b
  380. *|    used only by divide support
  381. *|    result d contains right, sign is non-zero
  382. *|    if result (from divide) should be negative.
  383. *|
  384. *|
  385. *.globl prabs
  386. *    left=8.
  387. *    right=4.
  388. *    sign=3.
  389. *prabs:    clr    sign(s)
  390. *    ldd    left(s)
  391. *    bge    tryr
  392. *    nega
  393. *    negb
  394. *    sbca    #0
  395. *    std    left(s)
  396. *    inc    sign(s)
  397. *tryr:    ldd    right(s)
  398. *    bge    done
  399. *    nega
  400. *    negb
  401. *    sbca    #0
  402. *    dec    sign(s)
  403. *    std    right(s)
  404. *done:    rts
  405. *
  406.  
  407. ******************************************************
  408. * Signed modulo. 16 bit modulo 16 bit yielding 16 bit.
  409. * Underflow is possible, not checked.
  410.  
  411.  
  412.  
  413. * entry : D contains divisor, 
  414. *            @ stackptr is return adr
  415. *            @ stackptr + 2 is dividend
  416. * exit  : D contains 16 bit remainder,
  417. *            quotient not returned.
  418. *            stackptr is entry stackptr + 4 ( stack is restored
  419. *            to as it was before caller pushed operand.)
  420.  
  421. * ccsmod
  422. * Not implemented yet.
  423. * What follows is 6809 code.
  424. * To Be Done: convert all labels to start with cc
  425.  
  426. *|    signed mod
  427. *|    calling: (left / right)
  428. *|        push left
  429. *|        ldd right
  430. *|        jsr smod
  431. *|    result in d, arg popped.
  432. *|
  433. *    left=6
  434. *    right=2
  435. *    sign=1
  436. *    count=0
  437. *    return=4
  438. *    CARRY=1
  439. *.globl smod,mod,ASSERTFAIL
  440. *.globl mrabs
  441. *smod:    leas    -4(s)
  442. *    std    right(s)
  443. *    bne    nozero
  444. *    swi2
  445. *    .byte    ASSERTFAIL
  446. *nozero:    jsr    mrabs
  447. *mod:    clr    count(s)    | prescale divisor
  448. *    inc    count(s)
  449. *mscl:    inc    count(s)
  450. *    aslb
  451. *    rola
  452. *    bpl    mscl
  453. *    std    right(s)
  454. *    ldd    left(s)
  455. *    clr    left(s)
  456. *    clr    left+1(s)
  457. *mod1:    subd    right(s)    | check subtract
  458. *    bcc    mod2
  459. *    addd    right(s)
  460. *    andcc    #~CARRY
  461. *    bra    mod3
  462. *mod2:    orcc    #CARRY
  463. *mod3:    rol    left+1(s)    | roll in carry
  464. *    rol    left(s)
  465. *    lsr    right(s)
  466. *    ror    right+1(s)
  467. *    dec    count(s)
  468. *    bne    mod1
  469. *    tst    sign(s)        | sign fiddle
  470. *    beq    nochg
  471. *    nega
  472. *    negb
  473. *    sbca    #0
  474. *nochg:    std    right(s)    | move return addr
  475. *    ldd    return(s)
  476. *    std    left(s)
  477. *    ldd    right(s)
  478. *    leas    6(s)
  479. *    rts
  480.  
  481. *|    mrabs.  converts both args to unsigned, and
  482. *|    remembers result sign as the sign of the left
  483. *|    argument.  (for signed modulo)
  484. *|    result d contains right, sign is non-zero
  485. *|    if result (from mod) should be negative.
  486. *|
  487. *|
  488. *.globl mrabs
  489. *    left=8.
  490. *    right=4.
  491. *    sign=3.
  492. *mrabs:    clr    sign(s)
  493. *    ldd    left(s)
  494. *    bge    tryr
  495. *    nega
  496. *    negb
  497. *    sbca    #0
  498. *    std    left(s)
  499. *    inc    sign(s)
  500. *tryr:    ldd    right(s)
  501. *    bge    done
  502. *    nega
  503. *    negb
  504. *    sbca    #0
  505. *    std    right(s)
  506. *done:    rts
  507. *
  508.  
  509.  
  510. ******************************************************
  511. * Case statement support
  512.  
  513. * Case table is of the form:
  514. *     FDB char_value, label
  515. *     FDB char_value, label
  516. *     FDB label,0
  517. * That is, it consist of word pairs.
  518. * The first word of a pair is the switch value.
  519. * The second word of a pair is the label to jump to.
  520. * The last pair is special -- the second word is zero
  521. * and the first word is the label for the default case,
  522. * if there is one, else it is the label on the code
  523. * following the switch.
  524. * Note that this form is different than that for v2 SmallC.
  525.  
  526. * TBD document the calling parameters
  527. * entry : D contains switch value, 
  528. *            @ stackptr is address of jump table
  529. * exit  : exit is a jump 
  530. *            stackptr is entry stackptr + 2 ( stack is restored
  531. *            to as it was before caller pushed switch value.)
  532.  
  533. * cccase
  534. * Not implemented yet.
  535. * v2 code is readily available but table format differs.
  536. * 6809 version was lost.
  537.  
  538.  
  539. ******************************************************
  540. * Unknown use, relics ???
  541. _etext
  542. *    .bss 
  543. _eend
  544. *    .data 
  545. *_brkend:    .wval    _eend 
  546. _edata    
  547.  
  548.  
  549.  
  550.  
  551. ******************************************************
  552.     OPT    l
  553.  
  554.  
  555.  
  556. #endasm
  557. /* end C include file */
  558.  
  559.